2.7 Die Select-Case-Verzweigung
 
Manchmal sind es zu viele Fälle, die nicht mit hintereinander geschalteten und auch nicht verschachtelten If-Verzweigungen gestaltet werden können oder sollen. Dafür steht ein weiterer Verzweigungstyp zur Verfügung: die Case-Verzweigung.
Select Case Variable
Case Wert1
Anweisung1
Case Wert2
Anweisung2
Case Wert3
Anweisung3
[...]
[Case Else]
[Letzte Anweisung]
End Select
Also beispielsweise:
Select Case Bedürfnis
Case Lust
Süßigkeiten = "Nougat"
Case Hunger
Süßigkeiten = "Chips"
Case Spieltrieb
Süßigkeiten = "Kinderschokolade"
Case Besuch
Süßigkeiten = "Gummibärchen"
Case Halsweh
Süßigkeiten = "Hustenbonbons"
Case Else
Süßigkeiten = "Marzipan"
End Select
Das versuchen wir doch mal. Ich hatte vor kurzem eine kleine Rechenaufgabe. Gesucht war die Anzahl der vergangenen Monate eines Geschäftsjahrs. Das Geschäftsjahr fängt im April an, also aus 4 wird 1, aus 5 (Mai) wird 2, ... aus 12 (Dezember) wird 9, aus 1 (Januar) wird 10, ... und aus 3 wird 12.
Sub Geschäftsjahr1()
Dim intMonat As Integer
Dim intAusgabeMonate As Integer
Dim strText As String
intMonat = Me.txtMonat.Text
Select Case intMonat
Case 1, 2, 3
intAusgabeMonate = intMonat + 9
strText = "Es sind " & _
intAusgabeMonate.ToString() & _
" Monate vergangen."
Case 4
intAusgabeMonate = intMonat - 3
strText = "Es ist " & _
intAusgabeMonate.ToString() & _
" Monat vergangen."
Case Else
intAusgabeMonate = intMonat - 3
strText = "Es sind " & _
intAusgabeMonate.ToString() & _
" Monate vergangen."
End Select
MessageBox.Show(strText)
End Sub
Und nun eine Variante, die auch funktioniert:
Sub Geschäftsjahr2()
Dim intMonat As Integer
Dim intAusgabeMonate As Integer
Dim strText As String
intMonat = Me.txtMonat.Text
Select Case intMonat
Case 1 To 3
intAusgabeMonate = intMonat + 9
strText = "Es sind " & _
intAusgabeMonate.ToString() & _
" Monate vergangen."
Case 4
intAusgabeMonate = intMonat - 3
strText = "Es ist " & _
intAusgabeMonate.ToString() & _
" Monat vergangen."
Case Is > 4
intAusgabeMonate = intMonat - 3
strText = "Es sind " & _
intAusgabeMonate.ToString() & _
" Monate vergangen."
End Select
MessageBox.Show(strText)
End Sub
Nach Case kann also entweder ein Wert stehen, mehrere Werte durch Kommata getrennt oder zwei Werte mit allen Zwischenwerten mit einem To verbunden oder auch Is und ein Vergleichsoperator.
Wann aber verwendet man nun If...Then...Else und wann Select Case? Ich komme fast immer mit If ... Then ... Else aus. Wird nur eine Bedingung überprüft, dann finde ich sie auch übersichtlicher. Wenn ich allerdings mehrere Werte gleichzeitig überprüfen möchte, dann hilft mir Select Case. Beispielsweise ist:
If strMonat = "Januar" Or strMonat = "Februar" _
Or strMonat = "März" Or strMonat = "April" Then
sehr lang und umständlich. Kürzer ist:
Select Case strMonat
Case "Januar", "Februar", "März", "April"
Oft aber kann die eine oder die andere Verzweigung verwendet werden. Dieses Mal soll die Abfrage der ComboBox mit der Select-Case-Verzweigung durchgeführt werden:
Select Case cboAuswahl.SelectedIndex
Case 0
Me.lstListe.SelectionMode = _
Windows.Forms.SelectionMode.One
Case 1
Me.lstListe.SelectionMode = _
Windows.Forms.SelectionMode.MultiExtended
Case 2
Me.lstListe.SelectionMode = _
Windows.Forms.SelectionMode.MultiSimple
End Select
Abbildung 2.9
Eine Mehrfachauswahl ist möglich.
Bei der Listbox hatten wir den Fall, dass der Benutzer fälschlicherweise nichts auswählt. Und hier? Kann er hier nichts auswählen? Viel schlimmer: Es gibt tatsächlich Benutzer, die schreiben Text in die Combobox. Und sie verschreiben sich natürlich. Es genügt, hinter »Einzelauswahl« ein Leerzeichen einzugeben. Und schon trifft keiner der drei vorgegebenen Fälle mehr zu. Deshalb wird auch dieser Fall abgefangen:
...
Case 2
Me.lstListe.SelectionMode = _
Windows.Forms.SelectionMode.MultiSimple
Case Else
Messagebox.Show("Der eingegebene Wert ist kein " & _
"Eintrag der Liste")
lstListe.SelectedIndex = 0
End Select
Abbildung 2.10
Leider wird dieser Fehler so nicht abgefangen.
|